package pe.com.drokasa.android.client.controller.productos;

import java.util.List;

import pe.com.drokasa.android.client.R;
import pe.com.drokasa.android.client.constantes.Constantes;
import pe.com.drokasa.android.client.constantes.Constantes.MensajeSistema;
import pe.com.drokasa.android.client.controller.BaseActivity;
import pe.com.drokasa.android.client.excepcion.ExcepcionInesperada;
import pe.com.drokasa.android.client.model.Producto;
import pe.com.drokasa.android.client.model.Sucursal;
import pe.com.drokasa.android.client.service.StockService;
import pe.com.drokasa.android.client.service.impl.StockServiceREST;
import pe.com.drokasa.android.client.service.impl.StockServiceSocket;
import pe.com.drokasa.android.client.util.VariableAplicacion;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;

/**
 * Activity de la vista del detalle de producto. Desde aqu&iacute;
 * se podr&aacute; realizar la consulta de stock del mismo en
 * todas las sucursales.
 * 
 * @author Synopsis S.A
 *
 */
public class DetalleProductoActivity extends BaseActivity 
{
	private TextView grupo;
	private TextView codigo;
	private TextView nombre;
	private TextView precio;
	
	private StockService stockService;
	
	/**
	 * @see pe.com.drokasa.android.client.controller.BaseActivity#onCreate(android.os.Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_detalle_producto);
		
		inicializarFormulario();
	}

	/**
	 * Inicializa el formulario de busqueda de productos
	 * obteniendo las referencias a los controles en pantalla.
	 */
	private void inicializarFormulario()
	{
		if(Constantes.CANAL_SOCKETS.equals(VariableAplicacion.getCanal()))
		{
			Log.d(Constantes.TAG, "Se usara sockets para la comunicacion con MIRROR.");
			stockService = new StockServiceSocket();
		}
		else
		{
			Log.d(Constantes.TAG, "Se usara webservice para la comunicacion con MIRROR.");
			stockService = new StockServiceREST();
		}
		
		grupo = (TextView) findViewById(R.id.detalle_producto_grupo);
		codigo = (TextView) findViewById(R.id.detalle_producto_codigo);
		nombre = (TextView) findViewById(R.id.detalle_producto_nombre);
		precio = (TextView) findViewById(R.id.detalle_producto_precio);
		
		Producto producto = (Producto) VariableAplicacion.getObjeto(VariableAplicacion.PRODUCTO_SELECCIONADO);
		
		grupo.setText(producto.getGrupo());
		codigo.setText(producto.getCodigo());
		nombre.setText(producto.getNombre());
		precio.setText(producto.getPrecio());
	}
	
	/**
	 * @param botonVerStock
	 */
	public void verStock(View botonVerStock)
	{
		deshabilitarBoton(botonVerStock);
		VariableAplicacion.setObjeto(VariableAplicacion.PRODUCTO_SELECCIONADO, codigo.getText().toString());
		new ConsultarStockTask().execute();
	}
	
	/**
	 * @see pe.com.drokasa.android.client.controller.BaseActivity#onCreateOptionsMenu(android.view.Menu)
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) 
	{
		return super.onCreateOptionsMenu(menu);
	}
	
	/**
	 * Clase encargada de realizar la consulta de stock de manera as&iacute;ncrona
	 * hacia el servicio correspondiente.
	 * 
	 * @author Synopsis S.A
	 *
	 */
	public class ConsultarStockTask extends AsyncTask<Void, Void, Boolean>
	{
		private final ProgressDialog dialog = new ProgressDialog(DetalleProductoActivity.this);
		
		/**
		 * @see android.os.AsyncTask#onPreExecute()
		 */
		@Override
		protected void onPreExecute() 
		{
			this.dialog.setIndeterminate(true);
			this.dialog.setMessage(MensajeSistema.INFORMACION_CARGANDO);
			this.dialog.show();
		}
		
		/**
		 * @see android.os.AsyncTask#doInBackground(Params[])
		 */
		@Override
		protected Boolean doInBackground(Void... params) 
		{
			String codigoProducto = (String) VariableAplicacion.getObjeto(VariableAplicacion.PRODUCTO_SELECCIONADO);
			try 
			{
				VariableAplicacion.setObjeto(VariableAplicacion.SUCURSALES, stockService.obtenerStockProducto(codigoProducto));
			} 
			catch (ExcepcionInesperada e) 
			{
				Log.e(Constantes.TAG, "Ocurrio un error al consultar el stock de producto", e);
				return false;
			}
			
			return true;
		}
		
		/**
		 * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
		 */
		@Override
		protected void onPostExecute(Boolean result) 
		{
			if (this.dialog.isShowing())
			{
				this.dialog.dismiss();
			}
			if(result)
			{
				@SuppressWarnings("unchecked")
				List<Sucursal> resultados = (List<Sucursal>) VariableAplicacion.getObjeto(VariableAplicacion.SUCURSALES);
				
				if(resultados.isEmpty())
				{
					elementoSeleccionadoIniciadorAccion.setEnabled(true);
					mostrarAlertDialogInformacion(MensajeSistema.INFORMACION_PRODUCTO_NO_EXISTE_EN_BD);
				}
				else
				{
					elementoSeleccionadoIniciadorAccion.setEnabled(true);
					startActivity(new Intent(DetalleProductoActivity.this, ResultadosStockActivity.class));					
				}
			}
			else
			{
				mostrarAlertDialogErrorValidacion(MensajeSistema.ERROR_CONSULTA_STOCK);
			}
		}
	}
}